package api_demo;

import cn.hutool.http.HttpException;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import dto.ApplyBo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.codec.binary.Base64;
import org.springframework.stereotype.Service;
import sun.misc.BASE64Decoder;
import utils.MD5Util;
import utils.StringUtils;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 对接示例
 *
 * api : https://www.showdoc.com.cn/1353427028638416/6706582082080321
 *
 * 根据文档，完成如下大致的api接口调用
 *
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class Demo2 {

    //加密方法
    public static String encrypt(String content, String key) {
        byte[] originalContent = content.getBytes(StandardCharsets.UTF_8);
        byte[] encryptKey = key.getBytes();
        try {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");;
            SecretKeySpec skeySpec = new SecretKeySpec(encryptKey, "AES");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encrypted = cipher.doFinal(originalContent);
            return Base64.encodeBase64String(encrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //解密方法
    public static String decrypt(String sSrc, String sKey){
        try {
            byte[] raw = sKey.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
            try {
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original,"utf-8");
                return originalString;
            } catch (Exception e) {
                System.out.println(e.toString());
                return null;
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
            return null;
        }
    }


    /**
     *  对接主体
     * @param applyBo
     * @param url
     * @return
     */
    public static PushResultDto push_jwy(ApplyBo applyBo, String url){
        log.info("===推送信息={}==url:{}",applyBo,url);

        PushResultDto pushResultDto = PushResultDto.getInstance();
        Map<String, Object> paramMap = new HashMap<>();
        String phone = applyBo.getPhone();
        // 撞库
        String secretKey = "307C6ED8946DE351";  //第三方密钥
        String channel = "xyzxyzxyz";       //第三方渠道码
        long timestamp = System.currentTimeMillis();
        String phoneMd5 = MD5Util.encode(phone);
        log.info("==channel:{}=timestamp:{}===secretKey:{}==",channel,timestamp,secretKey);
        String sign = channel + "&" + timestamp + "&" + secretKey;  //构建签名参数
        sign =  MD5Util.encode(sign);
        String encrypt = encrypt(phoneMd5, secretKey);
        paramMap.put("channel",channel);
        paramMap.put("timestamp",timestamp);
        paramMap.put("sign",sign);
        paramMap.put("bizParam",encrypt);
        String bizParamJson = JSONUtil.toJsonStr(paramMap); //构建json字符串，也用hutool工具类
        log.info("==bizParamJson:{}==",bizParamJson);

        try {
            //撞库请求
            String zk = HttpRequest.post("http://api.loan.taoqian123.com.cn/v1/assistant/user-exist")
                    .body(bizParamJson)//表单内容
                    .timeout(3000)//超时，毫秒
                    .execute().body();
            log.info("==撞库返回:{}==",zk);
            JSONObject jsonObject = JSONUtil.parseObj(zk);
            JSONObject data = jsonObject.getJSONObject("data");
            Integer code = data.getInt("code"); //1新用户 2老用户
            if(code==2){
                pushResultDto.setPushResult("用户已存在!");
                pushResultDto.setPushStatus(false);
                return pushResultDto;
            }else{
                // 申请金额 单位：万
                paramMap.put("demand_amount", applyBo.getLoan());
                // 公积金 100【无】；101【3个月以下】；102【3-6个月】；103【6个月以上】
                paramMap.put("fund", applyBo.getFund()==1?101:100);
                // 社保： 200【无】；201【3个月以下】；202【3-6个月】；203【6个月以上】
                paramMap.put("social", applyBo.getHas()==1?201:200);
                // 保险情况 ：300【无】；301【投保人寿险且保两年以下】；302【投保人寿险且保两年以上】
                paramMap.put("insurance", applyBo.getBdStatus()==1?301:300);
                //0:无芝麻分 1:600分以下 2:600-650分 3:650-700分 4:700分以上
                // 芝麻分 ：500【无】；501【580分以下】；502【580-599分】；503【600-619分】；504【620-649分】；505【650-699分】；506【700分以上】
                Integer zhima_score = null;
                if(applyBo.getZhimaCredit()==0){zhima_score = 500; }
                if(applyBo.getZhimaCredit()==1){zhima_score = 501; }
                if(applyBo.getZhimaCredit()==2){zhima_score = 503; }
                if(applyBo.getZhimaCredit()==3){zhima_score = 505; }
                if(applyBo.getZhimaCredit()==4){zhima_score = 506; }
                paramMap.put("zhima_score", zhima_score);
                // 信用卡额度 ：600【无】；601【3000以下】；602【3000-1万】；603【1-3万】；604【3万以上】；
                paramMap.put("credit_card_limit", 600);
                // 微粒贷 ：700【无】；701【3000以下】；702【3000-1万】；703【1-3万】；704【3万以上】；
                paramMap.put("wld", 700);
                // 花呗 ：800【无】；801【3000以下】；802【3000-1万】；803【1-3万】；804【3万以上】；
                paramMap.put("huabei", 800);
                // 白条 ：900【无】；901【3000以下】；902【3000-1万】；903【1-3万】；904【3万以上】；
                paramMap.put("baitiao", 900);
                // 教育： 1000【初中】；1001【高中】；1002【中专】；1003【大专】；1004【本科】；1005【硕士】；1006【博士及以上】
                paramMap.put("education_level", 1000);
                // 职业： 1100【上班族】；1101【企业主】；1102【个体户】；1103【自由职业】
                paramMap.put("career", 1100);
                // 营业执照 ： 1200【无】；1201【有】
                paramMap.put("business_license", 1200);
                // 信用逾期情况：1300【无信用卡或贷款】；1301【1年内逾期超过3次或者90天】；1302【1年内逾期少于3次且少于90天】；1303【信用良好，无逾期】；1304【近一年无逾期】
                paramMap.put("credit_card_overdue", 1300);
                // 房产情况：1400【无】；1401【有按揭商品房】；1402【有全款商品房】；1403【有自建房】；1404【仅外地有房】
                paramMap.put("house", applyBo.getHouseProperty()==1?1401:1400);
                // 车产情况：1500【无车】；1501【有按揭汽车】；1502【有全款汽车】
                paramMap.put("car", applyBo.getCarProperty()==1?1501:1500);
                // 工资/收入发放方式： 1900【无】；1901【现金发放】；1902【转账工资】；1903【银行代发】
                paramMap.put("monthly_income_type", 1900);
                // 月收入 单位：元
                //paramMap.put("monthly_income", "");
                // 公司名称
                //paramMap.put("company_name", "");
                // 城市
                String shi = "";
                if(StringUtils.isNotBlank(applyBo.getCity())){
                    shi = applyBo.getCity().replace("市", "");
                }
                paramMap.put("city_name", shi);
                // 申请人姓名
                paramMap.put("realname",applyBo.getName());
                // 申请人身份证 身份证不传则必须传sex+age
//                paramMap.put("id_card_no", applyBo.getSex()+applyBo.getAge());
                // 性别：1【女】；2【男】
                paramMap.put("sex", applyBo.getSex()==1?2:1);
                // 年龄
                paramMap.put("age", applyBo.getAge());
                // 申请人手机号
                paramMap.put("mobile", phone);
                // 唯一订单号 最大长度64
                paramMap.put("order_sn", applyBo.getId());
                // TODO 测试加密解密数据准确性，可删除 start
                String jsonParamMap = JSONUtil.toJsonStr(paramMap);
                String encryptedJson = encrypt(jsonParamMap, secretKey);
//                log.info("加密前：json={}，加密后：json={}",jsonParamMap,encryptedJson);
                paramMap.put("bizParam",encryptedJson);
//                String decryptedJson = decrypt(encryptedJson, secretKey);
//                log.info("解密后：json={}，与加密前是否一致：json={}",decryptedJson,decryptedJson.equals(jsonParamMap)?"是":"否");
                String pushJson = JSONUtil.toJsonStr(paramMap);
                log.info("====推送参数=={}",pushJson);
                // TODO 测试加密解密数据准确性，可删除 end
                // 调用导单api
                url = "http://api.loan.taoqian123.com.cn/v1/assistant/order";
                String push = HttpRequest.post(url)
                        .body(pushJson)// 表单内容
                        .timeout(5000)// 超时，毫秒
                        .execute().body();
                log.info("==推送返回=={}",push);
                pushResultDto.setPushResult(push);
                JSONObject res = JSONUtil.parseObj(push);
                Integer res_code = res.getInt("status");
                if (res_code!=1){
                    pushResultDto.setPushStatus(false);
                    return pushResultDto;
                }
                pushResultDto.setPushStatus(true);
            }
            return pushResultDto;
        }catch (HttpException httpException){
            System.out.println("httpException===="+httpException.getMessage());
            pushResultDto.setPushStatus(false);
            pushResultDto.setPushResult(httpException.getMessage());
            return pushResultDto;
        }catch (Exception e){
            log.info("error==={}",e.toString());
            pushResultDto.setPushStatus(false);
            pushResultDto.setPushResult(e.getMessage());
            return pushResultDto;
        }
    }


    public static void main(String[] args) {
        ApplyBo applyBo = new ApplyBo();
        applyBo.setId(111L);
        applyBo.setName("测试");
        applyBo.setSex(1);  //性别
        applyBo.setAge(18); //年龄
        applyBo.setCity("成都市"); //城市
        applyBo.setPhone("13388888888");    //手机号
        applyBo.setZhimaCredit(1);        //芝麻分
        applyBo.setHas(1);  //社保
        applyBo.setFund(1); //公积金
        applyBo.setHouseProperty(1);    //房产
        applyBo.setCarProperty(1);  //车产
        applyBo.setBdStatus(1); //保险保单

        PushResultDto pushResultDto = push_jwy(applyBo, "");
        System.out.println(pushResultDto);

    }

}
